package com.tm.client.interceptor;

import com.tm.client.sso.MySSOClientManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Component
public class MySSOClientInterceptor implements HandlerInterceptor {

    @Autowired
    MySSOClientManager mySSOClientManager;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession httpSession = request.getSession();
        /**
         * session中isLogin为true，表示用户已登录，无需走认证中心的认证流程
         */
        Boolean isLogin = (Boolean) httpSession.getAttribute("isLoginFlag");
        if(Boolean.TRUE.equals(isLogin)){
            return true;
        }

        String token = request.getParameter("token");
        /**
         * 判断请求URL中是否带了参数token，带了token说明是认证中心过来的请求，否则是应用过来的请求
         */
        if(StringUtils.isEmpty(token)){
            /**
             *如果token为空，到这里说明session中的isLogin也不是true，说明用户未通过认证中心的认证，需要进行认证
             */
            mySSOClientManager.loginCheck(request,response);
            return false;
        }else {
            /**
             * 如果token不为空，说明用户通过了认证中心的认证；
             * 通过认证的用户，需要拿token到认证中心进行校验，获取用户的信息；
             */
            String credificate = mySSOClientManager.verifyToken(token);
            if(StringUtils.isEmpty(credificate)){
                /**
                 * 如果用户信息为空，说明认证中心已经清除了该用户的会话，需要重新登录
                 */
                mySSOClientManager.toSSOLogin(request,response);
                return false;
            }else {
                /**
                 * 如果用户信息不为空，说明用户会话正常，并设置用户未已登录，后期就无需进行认证了
                 */
                httpSession.setAttribute("isLoginFlag",true);
                request.setAttribute("account",credificate);
                return true;
            }
        }
    }
}
